package com.igeek.jdbc.dao;

import com.igeek.jdbc.entity.Boy;
import com.igeek.jdbc.utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * DbUtils工具类
 * 1.封装了一系列的和数据库存取相关的方法（加载驱动、获得语句对象、执行、处理结果集等）
 * 2.通用的增删改查（CRUD）的操作
 *
 * QueryRunner类：
 *     1.update(Connection conn , String sql , Object... params)  执行增删改操作
 *     2.update(String sql , Object... params)  执行增删改操作，需要与有参构造方法QueryRunner(DataSource dataSource)搭配使用
 *
 *     3.query(Connection conn , String sql , ResultSetHandler handler , Object... params) 执行查询操作
 *     3.query(String sql , ResultSetHandler handler , Object... params) 执行查询操作，需要与有参构造方法QueryRunner(DataSource dataSource)搭配使用
 *
 *
 * ResultSetHandler接口  结果集处理器
 *      T handle(ResultSet rs)  返回的T，可以是实例bean ， 集合bean ， Object对象
 *
 *      实现类：
 *      1.BeanHandler 将结果集的第一行，封装成对象，并且返回
 *          new BeanHandler<>(Xxx.class)
 *      2.BeanListHandler 将结果集中的所有行，封装成集合对象，并返回
 *          new BeanListHandler<>(Xxx.class)
 *      3.ScalarHandler 将结果集中的第一行第一列（唯一的字段），以Object类型返回
 *          new ScalarHandler()
 *
 */
public class BoyDaoByDbUtils {

    //查询单个结果集
    public Boy selectOne(Integer id) throws SQLException {
        //1.获得连接对象
        Connection conn = JDBCUtils.getConn();

        //2.封装QueryRunner的对象
        QueryRunner runner = new QueryRunner();

        //3.执行查询操作
        /**
         * query 查询的方法
         * @param conn 连接对象
         * @param sql  SQL语句
         * @param BeanHandler 对象
         * @param id  传入的参数
         *
         * @result 返回值实例
         */
        Boy boy = runner.query(conn, "select * from boy where id = ?", new BeanHandler<>(Boy.class), id);

        //4.返回实例bean
        return boy;
    }

    //通过姓名查询列表
    public List<Boy> selectAll(String name) throws SQLException {
        //1.获得连接
        Connection conn = JDBCUtils.getConn();
        //2.封装QueryRunner的对象
        QueryRunner runner = new QueryRunner();
        //3.执行查询列表的操作
        List<Boy> boyList = runner.query(conn, "select * from boy where name like concat('%', ? ,'%')", new BeanListHandler<>(Boy.class), name);
        //4.返回集合
        return boyList;
    }


    //查询总记录数
    public Object selectCounts(String name) throws SQLException {
        //1.获得连接
        Connection conn = JDBCUtils.getConn();
        //2.封装QueryRunner的对象
        QueryRunner runner = new QueryRunner();
        //3.执行查询单个记录
        Object obj = runner.query(conn, "select count(*) from boy where name like concat('%', ? ,'%')", new ScalarHandler(), name);
        //4.返回结果
        return obj;
    }


    //添加
    public void insert(Boy boy) throws SQLException {
        //1.获得连接
        Connection conn = JDBCUtils.getConn();
        //2.封装QueryRunner的对象
        QueryRunner runner = new QueryRunner();
        //3.执行插入操作
        int i = runner.update(conn, "insert into boy(name) values(?)", boy.getName());
        //4.输出插入成功
        System.out.println(i>0 ? "插入成功" :"插入失败");
    }


    //修改
    public void update(Boy boy) throws SQLException {
        //1.获得连接
        Connection conn = JDBCUtils.getConn();
        //2.封装QueryRunner的对象
        QueryRunner runner = new QueryRunner();
        //3.执行修改操作
        int i = runner.update(conn, "update boy set name = ? where id = ?", boy.getName() , boy.getId());
        //4.输出修改成功
        System.out.println(i>0 ? "修改成功" :"修改失败");
    }


    //删除
    public void delete(Integer id) throws SQLException {
        //1.获得连接
        Connection conn = JDBCUtils.getConn();
        //2.封装QueryRunner的对象
        QueryRunner runner = new QueryRunner();
        //3.执行删除操作
        int i = runner.update(conn, "delete from boy where id = ?", id);
        //4.输出删除成功
        System.out.println(i>0 ? "删除成功" :"删除失败");
    }
}
